% -*- coding:utf-8 -*-

\section{Analizador Sintáctico}
\label{sec:sintactico}
Para la implementación del analizador sintáctico se ha utilizado la
herramienta \emph{bison}, en su versión 2.4.1. Al igual que se ha
comentado en la sección ~\ref{subsec:lexsrc} para el analizador
léxico, se ha optimizado el código de forma que el analizador generado
pueda ser implementado en una clase \emph{C++}.

Para realizar la implementación en \emph{bison} se ha partido de la gramática
libre de contexto que se puede ver en el listado ~\ref{lst:gram}

\lstset{
        basicstyle=\small,
        tabsize=2,
        commentstyle=\color{blue},
        keywordstyle=\bfseries,
        identifierstyle=\ttfamily,
        breaklines,
        captionpos=t,
        showstringspaces=false,
        extendedchars=true,
        frame=trBL,
	frameround=shadowbox
        xleftmargin=1.0cm,
        xrightmargin=0.5cm,
      }

\lstinputlisting[numbers=left]{./snippets/producciones.txt}
\begin{lst}
\caption{Gramática libre de contexto asociada al lenguaje.}
\label{lst:gram}
\end{lst}
\par

\lstset{
        basicstyle=\small,
        tabsize=2,
        commentstyle=\color{blue},
        keywordstyle=\bfseries,
        identifierstyle=\ttfamily,
        breaklines,
        captionpos=t,
        showstringspaces=false,
        extendedchars=true,
        frame=trBL,
	frameround=shadowbox
        xleftmargin=1.0cm,
        xrightmargin=0.5cm,
      }

\lstinputlisting[numbers=left, language=c++]{../../src/parser/parser.y}
\begin{lst}
\caption{Implementación del Analizador Sintáctico en \emph{flex}.}
\label{lst:sintactico}
\end{lst}
\par

El listado ~\ref{lst:sintactico} muestra la implementación del
analizador sintáctico (junto con las producciones utilizadas para el
analizador semátinco que se explicará en la sección
~\ref{sec:semantico}). El código es el estándard para un analizador
\emph{LALR} implementado con Bison y no tiene nada destacable, salvo
la función \emph{netthumb::Parser::error} que se utiliza para mostrar
mensajes de error.

\subsection{Clase \emph{Driver}}
\label{sec:driver}
Como se ha comentado en las secciones \ref{subsec:lexsrc} y
~\ref{sec:sintactico} el analizador léxico y el sintáctico se
implementan como una clase en \emph{C++}. Para utilizar estas dos
clases se implementa una clase llamada \emph{Driver} compuesta a su
vez de las clases \emph{Parser} y \emph{Scanner} (analizadores
sintáctico y léxico respectivamente). Para iniciar el análisis, se
invoca al método \emph{parse\_stream} (o \emph{parse\_string} según pueda
convenir) y se le pasa como argumento la ruta al archivo a parsear. El
método \emph{parse\_stream} (que puede verse en el listado ~\ref{lst:parse_file})
llama al analizador sintáctico (habiendo inicializado previamente al
analizador léxico). \emph{parse\_stream} devolverá \emph{true} si el
análisis se ha llevado a cabo correctamente.

\newpage
\begin{lstlisting}[language=C++]
bool
Driver::parse_stream(std::istream& in, const std::string& sname)

    streamname = sname;

    Scanner scanner(&in);
    scanner.set_debug(trace_scanning);
    this->lexer = &scanner;

    Parser parser(*this);
    parser.set_debug_level(trace_parsing);
    return (parser.parse() == 0);

\end{lstlisting}
\begin{lst}
\caption{Implementación de la función \emph{Driver::parse\_file}.}
\label{lst:parse_file}
\end{lst}

El listado ~\ref{lst:driverSrc} muestra la parte declarativa de la
clase \emph{Driver}.

\lstset{
        basicstyle=\small,
        tabsize=2,
        commentstyle=\color{blue},
        keywordstyle=\bfseries,
        identifierstyle=\ttfamily,
        breaklines,
        captionpos=t,
        showstringspaces=false,
        extendedchars=true,
        frame=trBL,
	frameround=shadowbox
        xleftmargin=1.0cm,
        xrightmargin=0.5cm,
      }

\lstinputlisting[numbers=left, language=c++]{../../src/driver.h}
\begin{lst}
\caption{Parte declarativa de la clase \emph{Driver}.}
\label{lst:driverSrc}
\end{lst}
\par



